<template>
    <div class="content">
        <div id="my-three"></div>
    </div>
</template>

<script setup>
    import * as THREE from 'three'
    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
    import { onMounted } from 'vue'

    //创建一个三维场景
    const scene = new THREE.Scene();
    //创建一个物体（形状）
    const geometry = new THREE.BoxGeometry(100, 100, 100);//长宽高都是100的立方体
    // const geometry = new THREE.SphereGeometry(60,40,40);//半径是60的圆
    //widthSegments, heightSegments：水平方向和垂直方向上分段数。widthSegments最小值为3，默认值为8。heightSegments最小值为2，默认值为6。
    //创建材质（外观）
    const material = new THREE.MeshLambertMaterial({
        color: 0x0000ff,//设置材质颜色(蓝色)
        // color: 0x00ff00,//(绿色)
        transparent: true,//开启透明度
        opacity: 0.5 //设置透明度
    });
    //创建一个网格模型对象
    const mesh = new THREE.Mesh(geometry, material);//网络模型对象Mesh
    //把网格模型添加到三维场景
    scene.add(mesh);//网络模型添加到场景中

    // 添加多个模型（添加圆形）
    const geometry2 = new THREE.SphereGeometry(60, 40, 40);
    const material2 = new THREE.MeshLambertMaterial({
        color: 0xffff00
    });
    const mesh2 = new THREE.Mesh(geometry2, material2); //网格模型对象Mesh
    // mesh3.translateX(120); //球体网格模型沿Y轴正方向平移120
    mesh2.position.set(120, 0, 0);//设置mesh3模型对象的xyz坐标为120,0,0
    scene.add(mesh2);

    //添加光源 //会照亮场景里的全部物体（氛围灯），前提是物体是可以接受灯光的，这种灯是无方向的，即不会有阴影。
    const ambient = new THREE.AmbientLight(0xffffff, 0.4);
    const light = new THREE.PointLight(0xffffff, 1);//点光源，color:灯光颜色，intensity:光照强度

    scene.add(ambient);
    light.position.set(200, 300, 400);
    scene.add(light);

    //创建一个透视相机，窗口宽度，窗口高度
    const width = window.innerWidth - 250;
    const height = window.innerHeight - 100;
    const camera = new THREE.PerspectiveCamera(45, width / height, 1, 1000);
    //设置相机位置
    camera.position.set(300, 300, 300);
    //设置相机方向
    camera.lookAt(0, 0, 0);

    //创建辅助坐标轴
    const axesHelper = new THREE.AxesHelper(200);//参数200标示坐标系大小，可以根据场景大小去设置
    scene.add(axesHelper);

    //创建一个WebGL渲染器
    const renderer = new THREE.WebGLRenderer()
    renderer.setSize(width, height)//设置渲染区尺寸
    renderer.render(scene, camera)//执行渲染操作、指定场景、相机作为参数

    const controls = new OrbitControls(camera, renderer.domElement)//创建控件对象
    controls.addEventListener('change', () => {
        renderer.render(scene, camera)//监听鼠标，键盘事件
    })
    onMounted(() => {
        document.getElementById('my-three').appendChild(renderer.domElement)
    })

</script>

<style scoped>
    .content{
        width: 100%;
        height: 100%;
    }
</style>